/// 映射（Set）
/// 集的每个对象只能出现一次，不能重复
void createMap () {
  // Set villains = new Set();
  var villains = <String>{};
  // -> {}

  villains.add('Joker');
  // -> {Joker}
  villains.addAll( ['Lex Luther', 'Voldemort'] );
  // -> {Joker, Lex Luther, Voldemort}
}

/// 所有属性
void createMap2 () {
  // Set villains = new Set.from(['Joker', 'Lex Luther', 'Voldemort']);
  var villains = {'Joker', 'Lex Luther', 'Voldemort'};

  // 返回第一个元素
  print(villains.first);
  // -> Joker

  // 返回最后一个元素
  print(villains.last);
  // -> Voldemort

  // 返回元素的数量
  print(villains.length);
  // -> 3

  // 集只有一个元素就返回元素，否则异常
  // print(villains.single);
  // -> Uncaught Error: Bad state: Too many elements

  // 集是否没有元素
  print(villains.isEmpty);
  // -> false

  // 集是否有元素
  print(villains.isNotEmpty);
  // -> true

  // 返回集的哈希码
  print(villains.hashCode);
  // -> 802278543

  // 返回对象运行时的类型
  print(villains.runtimeType);
  // -> _HashSet<String>

  // 返回集的可迭代对象
  print(villains.iterator);
  // -> Instance of 'DartIterator<String>'
}

/// 常用方法
void createMap3 () {
  // Set villains = new Set.from(["A", "B", "C"]);
  var villains = {'A', 'B', 'C'};

  // 添加一个值
  villains.add('D');
  // -> {A, B, C, D}

  // 添加一些值
  villains.addAll(["E", "F"]);
  // -> {A, B, C, D, E, F}

  // 以字符串输出集
  print(villains.toString());
  // -> {A, B, C, D, E, F}

  // 将集的值用指定字符连接，以字符串输出
  print(villains.join(','));
  // -> A,B,C,D,E,F

  // 集是否包含指定值
  print(villains.contains('C'));
  // -> true

  // 集是否包含一些值
  print(villains.containsAll(['E', 'F']));
  // -> true

  // 返回集的第几个值
  print(villains.elementAt(1));
  // -> B

  // 删除集的指定值，成功则返回true
  print(villains.remove('A'));
  // -> true

  // 删除集的一些值
  villains.removeAll(['B', 'C']);
  // -> {D, E, F}

  // 删除集的所有值
  villains.clear();
  // -> {}
}

void main () {
  createMap();
  createMap2();
  createMap3();
}
